package com.vviton.zyhj.common.logger;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.vviton.zyhj.common.utils.JsonUtil;
import com.wdcloud.framework.core.log.LogInterface;
import com.wdcloud.framework.core.log.annotation.MonitorLog;
import com.wdcloud.framework.core.log.entity.LogInfo;
import com.wdcloud.framework.core.log.entity.MonitorLogInfo;
import com.wdcloud.framework.core.util.DateUtil;

/**
 * 
 * ClassName: LogInterfaceImp <br/>
 * Function: LogInterfaceImp. <br/>
 * Date: 2016年3月10日 下午4:01:44 <br/>
 *
 * @author qiaocf
 * @version 1.0
 * @since JDK 1.7
 */
public class LogInterfaceImp implements LogInterface {
    /** 日志 **/
    private Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * 
     * createLogInfo,(创建日志). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * =============================================================== <br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * =============================================================== <br/>
     * 
     * @param text 文本内容
     * @return LogInfo
     * @since JDK 1.7
     */
    public LogInfo createLogInfo(String text) {
        LogInfo logInfo = new LogInfo(text);
        try {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            logInfo.setClientIp(request.getRemoteAddr());
            logInfo.setServerIp(request.getLocalAddr());
            logInfo.setServerPort(Integer.valueOf(request.getLocalPort()));
            logInfo.setUserAgent(request.getHeader("User-Agent"));
            logInfo.setMethod(request.getMethod());
        } catch (Exception localException) {
        }
        return logInfo;
    }

    /**
     * 
     * formatLogInfo,(转为json字符串). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * =============================================================== <br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * =============================================================== <br/>
     * 
     * @param logInfo 日志信息类
     * @return String
     * @since JDK 1.7
     */
    public String formatLogInfo(LogInfo logInfo) {
        return JSON.toJSONString(logInfo);
    }

    /**
     * 
     * saveMonitorLogInfo,(保存). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * =============================================================== <br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * =============================================================== <br/>
     * 
     * @param monitorLogInfo 日志信息监控
     * @since JDK 1.7
     */
    public void saveMonitorLogInfo(MonitorLogInfo monitorLogInfo) {
    }

    /**
     * 
     * updateMonitorLogInfo,(更新). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * =============================================================== <br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * =============================================================== <br/>
     * 
     * @param monitorLogInfo monitorLogInfo
     * @param logAnno logAnno
     * @since JDK 1.7
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public void updateMonitorLogInfo(MonitorLogInfo monitorLogInfo, MonitorLog logAnno) {
        LogModel lm = new LogModel();
        lm.setClassPath(monitorLogInfo.getClasspath());
        lm.setMethodName(monitorLogInfo.getMethodName());
        lm.setMethodText(monitorLogInfo.getText());
        lm.setMethodType(monitorLogInfo.getMethodType());
        lm.setStartTime(DateUtil.dateToString(monitorLogInfo.getStartTime(), "yyyy-MM-dd HH:mm:ss SSS"));
        lm.setEndTime(DateUtil.dateToString(monitorLogInfo.getEndTime(), "yyyy-MM-dd HH:mm:ss SSS"));
        lm.setExecuteTime(String.valueOf(monitorLogInfo.getExecuteTime()));
        lm.setStatus(String.valueOf(monitorLogInfo.isStatus()));

        if (monitorLogInfo.getMethodParams() != null) {
            Map inputParams = new HashMap();
            for (int i = 0; i < monitorLogInfo.getMethodParams().length; i++) {
                Object obj = monitorLogInfo.getMethodParams()[i];

                if ((!(obj instanceof BeanPropertyBindingResult)) && (!(obj instanceof HttpServletRequest)) && (!(obj instanceof HttpServletResponse))) {
                    inputParams.put("param" + (i + 1), obj);
                }
            }
            lm.setInputParams(inputParams);
        }

        //方法返回结果不作日志输出
        //lm.setResultParams(monitorLogInfo.getReturnValue());

        if ((logAnno.containRequest()) && ("action".equals(lm.getMethodType()))) {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            Map requestInfo = new HashMap();
            requestInfo.put("url", request.getRequestURI() + (request.getQueryString() == null ? "" : new StringBuilder("?").append(request.getQueryString()).toString()));
            requestInfo.put("clientIp", request.getRemoteAddr());
            requestInfo.put("serverIp", request.getLocalAddr());
            requestInfo.put("serverPort", Integer.valueOf(request.getLocalPort()));
            requestInfo.put("userAgent", request.getHeader("User-Agent"));
            lm.setRequestInfo(requestInfo);
        }
        lm.setErrorinfo(String.valueOf(monitorLogInfo.getThrowable()));

        this.logger.debug("Methods to monitor the log：" + JsonUtil.formatJson(JSON.toJSONString(lm, new SerializerFeature[] {SerializerFeature.WriteMapNullValue})));
    }

    /**
     * 
     * executeStartPage,(执行开始页). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param params 参数
     * @return String
     * @since JDK 1.7
     */
    public String executeStartPage(Map<String, Object> params) {
        return null;
    }

    /**
     * 
     * executeEndPage,(执行结束页). <br/>
     * Author: qiaocf <br/>
     * Create Date: 2016年3月10日 <br/>
     * ===============================================================<br/>
     * Modifier: qiaocf <br/>
     * Modify Date: 2016年3月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param id id
     * @param params 参数
     * @since JDK 1.7
     */
    public void executeEndPage(String id, Map<String, Object> params) {
    }
}